import tempfile
import pathlib
from typing import List, IO

from llama_index.core.schema import Document
from llama_index.readers.file import MarkdownReader

from ..data_parser_interface import DataParserInterface


class MarkdownParser(DataParserInterface):
    """
    一个专门用于解析 Markdown (.md) 文件的解析器。
    它封装了 LlamaIndex 的 MarkdownReader。
    """

    def parse(self, file: IO[bytes], file_format: str, **kwargs) -> List[Document]:
        """
        从 Markdown 文件的二进制流中解析出 Document 对象。
        由于 LlamaIndex 的部分读取器需要文件路径而非流，此方法内部会创建一个临时文件来兼容。
        """
        # 创建一个带 .md 后缀的临时文件，delete=False 确保在 with 块结束后文件不会被自动删除
        with tempfile.NamedTemporaryFile(delete=False, suffix=f".{file_format}") as tmp_file:
            # 将传入的二进制流内容写入临时文件
            tmp_file.write(file.read())
            # 获取临时文件的路径对象
            tmp_file_path = pathlib.Path(tmp_file.name)

        try:
            # 初始化 LlamaIndex 的 Markdown 读取器
            reader = MarkdownReader()
            # 使用临时文件的路径来加载数据
            return reader.load_data(file=tmp_file_path, **kwargs)
        finally:
            # 关键：确保在操作完成后（无论成功或失败）都删除临时文件，避免磁盘空间泄漏
            tmp_file_path.unlink() 